import ast
import logging
from 程序核心代码.mvvm重构.基础定义.基础图形项.节点图形项.带组件带布局的节点图形项 import 带组件带布局的节点图形项
from 程序核心代码.mvvm重构.基础定义.基础模型.ast节点模型基类 import ast节点基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 注册节点图形项

logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

@注册节点模型(ast.Import)
class 导入节点模型(ast节点基础模型):
    """
    导入节点模型，用于表示Python中的import语句
    例如: import os, sys
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "导入节点", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 处理导入的模块
        self.导入模块列表 = []
        for 导入名称 in self._ast节点.names:
            模块名 = 导入名称.name
            别名 = 导入名称.asname
            self.导入模块列表.append((模块名, 别名))

        # 设置参数显示
        self.参数名 = "导入:"
        self.参数值 = self._格式化导入语句()

        # 添加数据流输出接口，表示导入的模块可以被其他节点使用
        for 模块名, 别名 in self.导入模块列表:
            显示名 = 别名 if 别名 else 模块名
            self.添加接口到节点("数据流", "输出", 接口名称=f"模块_{显示名}")

    def _格式化导入语句(self):
        """格式化导入语句，用于显示"""
        导入语句 = []
        for 模块名, 别名 in self.导入模块列表:
            if 别名:
                导入语句.append(f"{模块名} as {别名}")
            else:
                导入语句.append(模块名)
        return "import " + ", ".join(导入语句)

@注册节点模型(ast.ImportFrom)
class 从模块导入节点模型(ast节点基础模型):
    """
    从模块导入节点模型，用于表示Python中的from...import语句
    例如: from os import path, environ
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "从模块导入节点", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 处理导入的内容
        self.模块名 = self._ast节点.module
        self.导入项列表 = []
        for 导入名称 in self._ast节点.names:
            项名 = 导入名称.name
            别名 = 导入名称.asname
            self.导入项列表.append((项名, 别名))

        # 设置参数显示
        self.参数名 = "导入:"
        self.参数值 = self._格式化导入语句()

        # 添加数据流输出接口，表示导入的项可以被其他节点使用
        for 项名, 别名 in self.导入项列表:
            显示名 = 别名 if 别名 else 项名
            self.添加接口到节点("数据流", "输出", 接口名称=f"导入项_{显示名}")

    def _格式化导入语句(self):
        """格式化从模块导入语句，用于显示"""
        导入项 = []
        for 项名, 别名 in self.导入项列表:
            if 别名:
                导入项.append(f"{项名} as {别名}")
            else:
                导入项.append(项名)

        级别前缀 = "." * self._ast节点.level if hasattr(self._ast节点, 'level') else ""
        模块名 = f"{级别前缀}{self.模块名}" if self.模块名 else 级别前缀

        return f"from {模块名} import {', '.join(导入项)}"

@注册节点图形项(ast.Import)
class 导入图形节点(带组件带布局的节点图形项):
    """
    导入语句的图形表示
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)

@注册节点图形项(ast.ImportFrom)
class 从模块导入图形节点(带组件带布局的节点图形项):
    """
    从模块导入语句的图形表示
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)